"""
socket服务端
这段代码是单线程、顺序执行的，只能接受一次消息。这意味着：
同一时间只能处理一个客户端连接。
在 conn.recv(1024) 没有收到数据之前，程序不会继续往下走。
如果有第二个客户端来连接，在第一个客户端没有完成通信并关闭连接之前，第二个客户端会被“卡住”，直到服务端回到 s.accept()。
"""
import socket
# 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址
s.bind(("127.0.0.1", 8888))
# 监听
s.listen(5) # 5表示最大连接数
# 循环等待客户端连接
while True:
    # 等待客户端连接 阻塞直到有客户端连接
    conn, addr = s.accept()
    # 接收客户端数据  阻塞直到有消息传入
    # 类型是字节数组bytes，需要解码成字符串
    data = conn.recv(1024)
    print(data.decode("utf-8"))
    # # 发送数据
    # conn.send(b"Hello, I am server")
    # 发送数据（在hello后面新增addr）
    conn.send(f"Hello {addr}, I am server".encode("utf-8"))
    # 关闭连接
    conn.close()